package com.cmsz.xpay.common.unionpay.sign;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;

/**
 * 签名验签安全信息管理工具
 * @author Eshin
 *
 */

public class SecureUtil {


	/**
	 * md5计算.
	 * 
	 * @param datas
	 *            待计算的数据
	 * @param encoding 
	 *             编码格式
	 * @return 计算结果
	 * @throws UnsupportedEncodingException 
	 */
	public static byte[] md5(String datas,String encoding) throws UnsupportedEncodingException {
			byte[] bytes =DigestUtils.md5(datas.getBytes(encoding));
			return bytes;
	}

	/**
	 * sha1计算.
	 * 
	 * @param datas
	 *            待计算的数据	 
	 * @param encoding 
	 *             编码格式
	 * @return 计算结果
	 * @throws UnsupportedEncodingException 
	 */
	public static byte[] sha1(String datas,String encoding) throws UnsupportedEncodingException {
			byte[] bytes =DigestUtils.sha1(datas.getBytes(encoding));
			return bytes;
	}

	/**
	 * md5计算后进行16进制转换
	 * 
	 * @param datas
	 *            待计算的数据
	 * @param encoding
	 *            编码格式
	 * @return 计算结果
	 * @throws UnsupportedEncodingException 
	 */
	public static byte[] md5X16(String datas, String encoding) throws UnsupportedEncodingException {
			String md5HexString = DigestUtils.md5Hex(datas.getBytes(encoding));
			return md5HexString.getBytes();
	}

	/**
	 * sha1计算后进行16进制转换<>
	 * 
	 * @param data
	 *            待计算的数据
	 * @param encoding
	 *            编码格式
	 * @return 计算结果
	 * @throws UnsupportedEncodingException 
	 */
	public static byte[] sha1X16(String datas, String encoding) throws UnsupportedEncodingException {
			//直接传入String会调用默认utf-8编码的方法，故传入编码后字节数组
			String sha1HexString = DigestUtils.sha1Hex(datas.getBytes(encoding));
			return sha1HexString.getBytes();
	}

	/**
	 * BASE64解码
	 * 
	 * @param inputByte
	 *            待解码数据
	 * @return 解码后的数据
	 * @throws IOException
	 */
	public static byte[] base64Decode(byte[] inputByte) throws IOException {
		return Base64.decodeBase64(inputByte);
	}

	/**
	 * BASE64编码
	 * 
	 * @param inputByte
	 *            待编码数据
	 * @return 解码后的数据
	 * @throws IOException
	 */
	public static byte[] base64Encode(byte[] inputByte) throws IOException {
		return Base64.encodeBase64(inputByte);
	}
	
	/**
	 * 私钥签名
	 * 
	 * @param privateKey
	 *            私钥
	 * @param data
	 *            待签名数据
	 * @param rsaType
	 *            rsa类型
	 * @return 结果 
	 * @throws Exception
	 */
	public static byte[] signByPrivateKey(PrivateKey privateKey, byte[] data,String rsaType)throws Exception {
		byte[] result = null;
		Signature st = Signature.getInstance(rsaType);
		st.initSign(privateKey);
		st.update(data);
		result = st.sign();
		return result;
	}
	/**
	 * 公钥验证签名
	 * 
	 * @param publicKey
	 *            公钥
	 * @param signData
	 *            签名数据
	 * @param srcData
	 *            摘要
	 * @param rsaType
	 *            rsa类型
	 * @return
	 * @throws Exception
	 */
	public static boolean validateByPublicKey(PublicKey publicKey,byte[] signData, 
			                          byte[] srcData,String rsaType) throws Exception {
		Signature st = Signature.getInstance(rsaType);
		st.initVerify(publicKey);
		st.update(srcData);
		return st.verify(signData);
	}
    
}
